package com.tim.source.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;

/**
 * 字符串工具类.
 * 
 * @author Tim.
 */
public class StringUtil {
	/**
	 * 转换字符串第一个字符为大写.
	 * 
	 * @param str
	 *            需要转换的字符串.
	 * @return String 首字母大写的字符串.
	 */
	public static String convertFirstCharToUpper(String str) {
		char first = Character.toUpperCase(str.charAt(0));
		return first + str.substring(1);
	}

	/**
	 * 转换字符串第一个字符为小写.
	 * 
	 * @param str
	 *            需要转换的字符串.
	 * @return String 首字母小写的字符串.
	 */
	public static String convertFirstCharToLower(String str) {
		char first = Character.toLowerCase(str.charAt(0));
		return first + str.substring(1);
	}

	/**
	 * 表名转换为类名.
	 * 
	 * @param tblName
	 *            数据库表名.
	 * @return String 表类名.
	 */
	public static String getClassName(String tblName) {
		if (tblName.startsWith("tbl")) {
			tblName = tblName.replace("tbl", "");
		}
		if (tblName.startsWith("_")) {
			tblName = tblName.substring(1);
		}
		String[] tempArr = tblName.split("_");
		if (tempArr.length == 1) {
			return StringUtil.convertFirstCharToUpper(tblName);
		} else {
			StringBuffer className = new StringBuffer();
			for (int i = 0; i < tempArr.length; i++) {
				className
						.append(StringUtil.convertFirstCharToUpper(tempArr[i]));
			}
			return className.toString();
		}
	}

	/**
	 * 依据数据库列名获取属性名.
	 * 
	 * @param colName
	 *            列名.
	 */
	public static String getProperName(String colName) {
		String[] propArr = colName.split("_");
		if (propArr.length > 1) {
			StringBuilder propName = new StringBuilder(propArr[0].toLowerCase());
			for (int i = 1; i < propArr.length; i++) {
				propName.append(convertFirstCharToUpper(propArr[i]));
			}
			return propName.toString();
		}
		return colName;
	}

	/**
	 * 转换路径为package.
	 * 
	 * @param path
	 *            包路径.
	 * @return String
	 */
	public static String getPackage(String path) {
		path = path.replace("/", ".");
		if (path.endsWith(".")) {
			path = path.substring(0, path.lastIndexOf("."));
		}
		return path;
	}

	/**
	 * 依据完整类名获取import语句.
	 * 
	 * @param className
	 *            完整类名.
	 * @return 指定类的import语句.
	 */
	public static String getImportString(String className) {
		return "import " + className + ";";
	}

	/**
	 * 转换字符串入文件.
	 * 
	 * @param content
	 *            文件内容.
	 * @param path
	 *            文件路径.
	 * @return boolean 是否转换成功.
	 */
	public static boolean convertToFile(String content, String path) {
		File file = new File(path);
		File parent = file.getParentFile();
		if (!parent.exists()) {
			parent.mkdirs();
		}
		try {
			file.createNewFile();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return convertToFile(content, file);
	}

	/**
	 * 将指定内容写入指定文件.
	 * 
	 * @param content
	 *            文件内容.
	 * @param file
	 *            文件.
	 * @return boolean 是否写入成功.
	 */
	public static boolean convertToFile(String content, File file) {
		try {
			OutputStream fos = new FileOutputStream(file);
			fos.write(content.getBytes());
			fos.flush();
			fos.close();
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 以指定字符集方式加载指定文件为字符串.
	 * 
	 * @param filePath
	 *            文件完整路径.
	 * @param encoding
	 *            字符集.
	 * @return String 文件字符串内容.
	 */
	public static String fileToString(String filePath, String encoding) {
		File file = new File(filePath);
		return fileToString(file, encoding);
	}

	/**
	 * 以指定字符集方式加载指定文件为字符串.
	 * 
	 * @param file
	 *            指定文件.
	 * @param encoding
	 *            字符集.
	 * @return String 文件内容，空则返回"".
	 */
	public static String fileToString(File file, String encoding) {
		if (file.exists()) {
			try {
				FileInputStream inputStream = new FileInputStream(file);
				byte[] data = new byte[inputStream.available()];
				inputStream.read(data);
				return new String(data, encoding);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return "";
	}

	/**
	 * 以UTF-8方式加载指定文件为字符串.
	 * 
	 * @param file
	 *            指定文件.
	 * @param encoding
	 *            字符集.
	 * @return String 文件内容，空则返回"".
	 */
	public static String fileToString(File file) {
		return fileToString(file, "UTF-8");
	}

	/**
	 * 以UTF-8方式加载指定文件为字符串.
	 * 
	 * @return String 文件字符串内容.
	 */
	public static String fileToString(String filePath) {
		return fileToString(filePath, "UTF-8");
	}
}
